<!DOCTYPE html>

<html>
<head>
  <title>dataUtil.coffee</title>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <link rel="stylesheet" media="all" href="public/stylesheets/normalize.css" />
  <link rel="stylesheet" media="all" href="docco.css" />
</head>
<body>
  <div class="container">
    <div class="page">

      <div class="header">
        
          <h1>dataUtil.coffee</h1>
        

        
          <div class="toc">
            <h3>Table of Contents</h3>
            <ol>
              
                
                <li>
                  <a class="source" href="admin.html">
                    admin.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.auditData.html">
                    api.auditData.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.auditEvent.html">
                    api.auditEvent.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.html">
                    api.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.entity.html">
                    api.entity.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.map.html">
                    api.map.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.server.html">
                    api.server.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.variable.html">
                    api.variable.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="api.view.html">
                    api.view.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="app.instance.html">
                    app.instance.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="appjs.html">
                    appjs.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="data.html">
                    data.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="dataUtil.html">
                    dataUtil.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="manager.html">
                    manager.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="messages.html">
                    messages.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="auditData.html">
                    auditData.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="auditEvent.html">
                    auditEvent.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="base.html">
                    base.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="entityDefinition.html">
                    entityDefinition.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="entityObject.html">
                    entityObject.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="eventAction.html">
                    eventAction.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="eventRule.html">
                    eventRule.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="link.html">
                    link.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="map.html">
                    map.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="shape.html">
                    shape.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="user.html">
                    user.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="userSettings.html">
                    userSettings.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="variable.html">
                    variable.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="adminRoutes.html">
                    adminRoutes.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="appRoutes.html">
                    appRoutes.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="settings.html">
                    settings.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="sockets.html">
                    sockets.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="tutorial.html">
                    tutorial.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="vectors.html">
                    vectors.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="statusTabView.html">
                    statusTabView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="toolsTabView.html">
                    toolsTabView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="usersTabView.html">
                    usersTabView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="adminView.html">
                    adminView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="alertView.html">
                    alertView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="auditDataManagerView.html">
                    auditDataManagerView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="auditEventManagerView.html">
                    auditEventManagerView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="baseView.html">
                    baseView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="createMapView.html">
                    createMapView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="entityManagerView.html">
                    entityManagerView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="footerView.html">
                    footerView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="helpView.html">
                    helpView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="entitiesTabView.html">
                    entitiesTabView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="inspectorTabView.html">
                    inspectorTabView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="mapTabView.html">
                    mapTabView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="shapeTabView.html">
                    shapeTabView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="controlsView.html">
                    controlsView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="labelEditView.html">
                    labelEditView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="linkCreatorView.html">
                    linkCreatorView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="linkLabelsView.html">
                    linkLabelsView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="linkView.html">
                    linkView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="shapeLabelsView.html">
                    shapeLabelsView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="shapeView.html">
                    shapeView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="shapesMoverView.html">
                    shapesMoverView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="mapView.html">
                    mapView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="menuView.html">
                    menuView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="overlayView.html">
                    overlayView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="scriptEditorView.html">
                    scriptEditorView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="settingsView.html">
                    settingsView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="startView.html">
                    startView.coffee
                  </a>
                </li>
              
                
                <li>
                  <a class="source" href="variableManagerView.html">
                    variableManagerView.coffee
                  </a>
                </li>
              
            </ol>
          </div>
        
      </div>

      
        
        <h2 id="system-data-util">System DATA UTIL</h2>

        
      
        
        <p>Data parsing and processing utilities.</p>

        
          <div class='highlight'><pre>SystemApp.DataUtil =</pre></div>
        
      
        
        <h2 id="text-normalization-helpers">TEXT NORMALIZATION HELPERS</h2>

        
      
        
        <p>Helper for text normalization. If <code>removeSymbols</code> is true, all symbols
including spaces will be stripped out of the result</p>

        
          <div class='highlight'><pre>    <span class="attribute">normalize</span>: <span class="function"><span class="params">(value, removeSymbols)</span> -&gt;</span>
        <span class="keyword">if</span> <span class="keyword">not</span> value?
            <span class="keyword">return</span> <span class="string">""</span>

        specialCharMap = [
            {<span class="attribute">base</span>:<span class="string">"A"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g</span>},
            {<span class="attribute">base</span>:<span class="string">"AA"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA732]/g</span>},
            {<span class="attribute">base</span>:<span class="string">"AE"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u00C6\u01FC\u01E2]/g</span>},
            {<span class="attribute">base</span>:<span class="string">"AO"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA734]/g</span>},
            {<span class="attribute">base</span>:<span class="string">"AU"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA736]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"AV"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA738\uA73A]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"AY"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA73C]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"B"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"C"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"D"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"DZ"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01F1\u01C4]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"Dz"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01F2\u01C5]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"E"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"F"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"G"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"H"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"I"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"J"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u004A\u24BF\uFF2A\u0134\u0248]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"K"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"L"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"LJ"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01C7]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"Lj"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01C8]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"M"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"N"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"NJ"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01CA]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"Nj"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01CB]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"O"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"OI"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01A2]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"OO"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA74E]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"OU"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0222]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"P"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"Q"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"R"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"S"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"T"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"TZ"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA728]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"U"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"V"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"VY"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA760]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"W"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"X"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"Y"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"Z"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"a"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"aa"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA733]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"ae"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u00E6\u01FD\u01E3]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"ao"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA735]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"au"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA737]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"av"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA739\uA73B]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"ay"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA73D]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"b"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"c"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"d"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"dz"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01F3\u01C6]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"e"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"f"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"g"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"h"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"hv"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0195]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"i"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"j"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"k"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"l"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"lj"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01C9]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"m"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"n"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"nj"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01CC]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"o"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"oi"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u01A3]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"ou"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0223]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"oo"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA74F]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"p"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"q"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"r"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"s"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"t"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"tz"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA729]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"u"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"v"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"vy"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\uA761]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"w"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"x"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"y"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g</span>},
            {<span class="attribute">base</span>: <span class="string">"z"</span>, <span class="attribute">letters</span>: <span class="regexp">/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g</span>}
        ]

        i = <span class="number">0</span></pre></div>
        
      
        
        <p>Replace all special characters with its normalized value.</p>

        
          <div class='highlight'><pre>        <span class="keyword">while</span> i &lt; specialCharMap.length
            value = value.replace(specialCharMap[i].letters, specialCharMap[i].base)
            i++</pre></div>
        
      
        
        <p>Check if spaces should be also removed.</p>

        
          <div class='highlight'><pre>        <span class="keyword">if</span> removeSymbols? <span class="keyword">and</span> removeSymbols
            value = value.replace RegExp(<span class="string">" "</span>, <span class="string">"g"</span>), <span class="string">""</span>
            value = value.replace <span class="regexp">/[^\w\s]/g</span>, <span class="string">""</span>

        <span class="keyword">return</span> value</pre></div>
        
      
        
        <p>Return a friendly URL key based on the value passed. It will remove all spaces
and encode the URL key.</p>

        
          <div class='highlight'><pre>    <span class="attribute">getUrlKey</span>: <span class="function"><span class="params">(value)</span> -&gt;</span>
        value = SystemApp.DataUtil.normalize value, <span class="literal">true</span>
        <span class="keyword">return</span> encodeURIComponent value</pre></div>
        
      
        
        <h2 id="audit-data-helpers">AUDIT DATA HELPERS</h2>

        
      
        
        <p>Check if a value represents a property of an <a href="auditData.html">AuditData</a>.</p>

        
          <div class='highlight'><pre>    <span class="attribute">hasAuditData</span>: <span class="function"><span class="params">(value)</span> -&gt;</span>
        <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> <span class="keyword">not</span> value? <span class="keyword">or</span> value <span class="keyword">is</span> <span class="string">""</span>
        value = value.toString()

        namespace = SystemApp.Settings.general.dataBindingKey + SystemApp.Settings.auditData.bindingNamespace
        specialKeyIndex = value.indexOf namespace
        <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> specialKeyIndex &lt; <span class="number">0</span></pre></div>
        
      
        
        <p>Check for a dot &quot;.&quot; or bracket &quot;[&quot; on the string.</p>

        
          <div class='highlight'><pre>        substr = value.substring specialKeyIndex
        hasDot = substr.indexOf(<span class="string">"."</span>) &gt; <span class="number">0</span>
        hasBracket = substr.indexOf (<span class="string">"["</span>) &gt; <span class="number">0</span>

        <span class="keyword">return</span> hasDot <span class="keyword">or</span> hasBracket</pre></div>
        
      
        
        <p>This will scrap all prefixes and texts from the specified value and
return only the relevant <a href="auditData.html">AuditData</a> property path.</p>

        
          <div class='highlight'><pre>    <span class="attribute">getOnlyTheAuditDataProperty</span>: <span class="function"><span class="params">(value)</span> -&gt;</span>
        <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> <span class="keyword">not</span> value? <span class="keyword">or</span> value <span class="keyword">is</span> <span class="string">""</span>

        namespace = SystemApp.Settings.general.dataBindingKey + SystemApp.Settings.auditData.bindingNamespace
        specialKeyIndex = value.indexOf namespace
        value = value.substring specialKeyIndex
        spaceIndex = value.indexOf <span class="string">" "</span>

        <span class="keyword">if</span> spaceIndex &gt; <span class="number">0</span>
            <span class="keyword">return</span> value.substring spaceIndex
        <span class="keyword">else</span>
            <span class="keyword">return</span> value</pre></div>
        
      
        
        <p>Parse the sepcified text and return a string with the current values
of referenced <a href="auditData.html">AuditData</a> properties.</p>

        
          <div class='highlight'><pre>    <span class="attribute">getAuditDataValue</span>: <span class="function"><span class="params">(value)</span> -&gt;</span>
        <span class="keyword">return</span> <span class="keyword">if</span> <span class="keyword">not</span> value? <span class="keyword">or</span> value <span class="keyword">is</span> <span class="string">""</span>

        namespace = SystemApp.Settings.general.dataBindingKey + SystemApp.Settings.auditData.bindingNamespace
        substr = value.substring(namespace.length + <span class="number">1</span>)

        dotPosition = substr.indexOf(<span class="string">"."</span>)
        bracketPosition = substr.indexOf (<span class="string">"["</span>)</pre></div>
        
      
        
        <p>Find dots and brackets to properly get the audit data name.</p>

        
          <div class='highlight'><pre>        <span class="keyword">if</span> dotPosition &gt;= <span class="number">0</span> <span class="keyword">and</span> dotPosition &lt; bracketPosition
            friendlyId = substr.substring <span class="number">0</span>, dotPosition
        <span class="keyword">else</span>
            friendlyId = substr.substring <span class="number">0</span>, bracketPosition

        item = SystemApp.Data.auditData.getByFriendlyId friendlyId

        <span class="keyword">if</span> item?
            path = substr.substring(item.length + <span class="number">1</span>)
            <span class="keyword">return</span> item.getPathValue path
        <span class="keyword">else</span>
            <span class="keyword">return</span> value</pre></div>
        
      
        
        <h2 id="custom-variables-helpers">CUSTOM VARIABLES HELPERS</h2>

        
      
        
        <p>Check if a value represents a <a href="variable.html">Variable</a>.</p>

        
          <div class='highlight'><pre>    <span class="attribute">hasHasVariable</span>: <span class="function"><span class="params">(value)</span> -&gt;</span>
        <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> <span class="keyword">not</span> value? <span class="keyword">or</span> value <span class="keyword">is</span> <span class="string">""</span>
        value = value.toString()

        namespace = SystemApp.Settings.general.dataBindingKey + SystemApp.Settings.variable.bindingNamespace
        specialKeyIndex = value.indexOf namespace
        <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> specialKeyIndex &lt; <span class="number">0</span>

        <span class="keyword">return</span> <span class="literal">true</span></pre></div>
        
      
        
        <p>Parse the sepcified text and return a string with the processed value
of the referenced <a href="variable.html">Variable</a>.</p>

        
          <div class='highlight'><pre>    <span class="attribute">getVariableValue</span>: <span class="function"><span class="params">(value, ref)</span> -&gt;</span>
        <span class="keyword">return</span> <span class="keyword">if</span> <span class="keyword">not</span> value? <span class="keyword">or</span> value <span class="keyword">is</span> <span class="string">""</span>

        namespace = SystemApp.Settings.general.dataBindingKey + SystemApp.Settings.variable.bindingNamespace
        s = value.substring(namespace.length + <span class="number">1</span>)

        indexParentheses = s.indexOf <span class="string">"("</span>
        indexSpace = s.indexOf <span class="string">" "</span></pre></div>
        
      
        
        <p>Find the first space or parentheses, otherwise
use the whole substring. If there are parentheses,
use whatever is inside as arguments to the custom variable.</p>

        
          <div class='highlight'><pre>        <span class="keyword">if</span> indexParentheses &gt; <span class="number">0</span>
            friendlyId = s.substring <span class="number">0</span>, indexParentheses
            args = s.substring indexParentheses + <span class="number">1</span>, s.indexOf(<span class="string">")"</span>)
        <span class="keyword">else</span> <span class="keyword">if</span> indexSpace &gt; <span class="number">0</span>
            friendlyId = s.substring <span class="number">0</span>, indexSpace
        <span class="keyword">else</span>
            friendlyId = s.substring <span class="number">0</span></pre></div>
        
      
        
        <p>Get variable.</p>

        
          <div class='highlight'><pre>        item = SystemApp.Data.variables.getByFriendlyId friendlyId

        <span class="keyword">if</span> item?</pre></div>
        
      
        
        <p>TODO! Return model AND EntityObject attributes combined, and not only one or another.</p>
<p>Make sure we&#39;re dealing with model attributes and not a view.</p>

        
          <div class='highlight'><pre>            ref = ref.model <span class="keyword">if</span> ref.model?
            ref = ref.entityObject <span class="keyword">if</span> ref.entityObject?
            ref = ref.attributes <span class="keyword">if</span> ref.attributes?

            <span class="keyword">return</span> SystemApp.DataUtil.runEval item.code(), args, ref
        <span class="keyword">else</span>
            <span class="keyword">return</span> s</pre></div>
        
      
        
        <h2 id="entity-property-helpers">ENTITY PROPERTY HELPERS</h2>

        
      
        
        <p>Check if a value represents an attribute of an <a href="entityObject.html">Entity Object</a>.</p>

        
          <div class='highlight'><pre>    <span class="attribute">hasEntityAttribute</span>: <span class="function"><span class="params">(value)</span> -&gt;</span>
        <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> <span class="keyword">not</span> value? <span class="keyword">or</span> value <span class="keyword">is</span> <span class="string">""</span>
        value = value.toString()

        namespace = SystemApp.Settings.general.dataBindingKey + SystemApp.Settings.entityObject.bindingNamespace
        specialKeyIndex = value.indexOf namespace
        <span class="keyword">return</span> <span class="literal">false</span> <span class="keyword">if</span> specialKeyIndex &lt; <span class="number">0</span>

        <span class="keyword">return</span> <span class="literal">true</span></pre></div>
        
      
        
        <p>Parse the specified text and return a string with the processed value
of the referenced <code>ref</code> <a href="entityObject.html">Entity Object</a> attribute.
A shape <a href="shapeView.html">view</a>, a <a href="shape.html">shape model</a> or
an <a href="entityObject.html">entity object</a> must be passed.</p>

        
          <div class='highlight'><pre>    <span class="attribute">getEntityAttributeValue</span>: <span class="function"><span class="params">(value, ref)</span> -&gt;</span>
        <span class="keyword">return</span> <span class="keyword">if</span> <span class="keyword">not</span> value? <span class="keyword">or</span> value <span class="keyword">is</span> <span class="string">""</span>

        namespace = SystemApp.Settings.general.dataBindingKey + SystemApp.Settings.entityObject.bindingNamespace
        s = value.substring(namespace.length + <span class="number">1</span>)
        comma = s.indexOf <span class="string">","</span></pre></div>
        
      
        
        <p>Make sure we&#39;re dealing with model attributes and not a view.</p>

        
          <div class='highlight'><pre>        ref = ref.model <span class="keyword">if</span> ref.model?
        ref = ref.entityObject <span class="keyword">if</span> ref.entityObject?
        ref = ref.attributes <span class="keyword">if</span> ref.attributes?</pre></div>
        
      
        
        <p>Multiple attributes might have been set separated by commas. In this case, display
the first attribute which has a value. Create an <code>arr</code> array with each value.</p>

        
          <div class='highlight'><pre>        <span class="keyword">if</span> comma &gt; <span class="number">0</span>
            arr = s.split <span class="string">","</span>
            <span class="keyword">for</span> a <span class="keyword">in</span> arr
                <span class="keyword">if</span> ref[a]? <span class="keyword">and</span> ref[a] <span class="keyword">isnt</span> <span class="string">""</span>
                    <span class="keyword">return</span> ref[a]</pre></div>
        
      
        
        <p>Return the desired property if no commas were found.</p>

        
          <div class='highlight'><pre>        <span class="keyword">return</span> ref[s]</pre></div>
        
      
        
        <h2 id="eval-helpers">EVAL HELPERS</h2>

        
      
        
        <p>Validate a Javascript eval. Will return null if it passes, otherwise
will return the validation error message.</p>

        
          <div class='highlight'><pre>    <span class="attribute">validateEval</span>: <span class="function"><span class="params">(code)</span> =&gt;</span>
        code = SystemApp.DataUtil.translateEval code

        <span class="keyword">try</span>
            f = <span class="keyword">new</span> Function(code)
            f()
        <span class="keyword">catch</span> e
            <span class="keyword">return</span> e

        <span class="keyword">return</span> <span class="literal">null</span></pre></div>
        
      
        
        <p>Run the specified Javascript eval. If the code is invalid, it will return null.
Before running the code, it will be parsed to match any <a href="auditData.html">AuditData</a>
or <a href="variable.html">Variable</a> and translated with the correspondent values.
If the <code>thisObj</code> is passed, bind it to the function scope.</p>

        
          <div class='highlight'><pre>    <span class="attribute">runEval</span>: <span class="function"><span class="params">(code, args, thisObj)</span> =&gt;</span>
        code = SystemApp.DataUtil.translateEval code

        <span class="keyword">try</span>
            callback = <span class="keyword">new</span> Function(code)

            <span class="keyword">if</span> args?
                args = args.split(<span class="string">","</span>)

            <span class="keyword">if</span> thisObj?
                f = callback.bind thisObj, args
                <span class="keyword">return</span> f()
            <span class="keyword">else</span>
                <span class="keyword">return</span> callback args

        <span class="keyword">catch</span> e
            <span class="keyword">return</span> <span class="literal">null</span>

        <span class="keyword">return</span> <span class="literal">null</span></pre></div>
        
      
        
        <p>Parse the code and translate helper keywords into real javascript objects and properties.
For example, <code>$MyAuditData.httpRequests[0]</code> will be replaced by
<code>SystemApp.Data.auditData.models[0].data().httpRequests[0]</code>.</p>

        
          <div class='highlight'><pre>    <span class="attribute">translateEval</span>: <span class="function"><span class="params">(code)</span> =&gt;</span>
        <span class="keyword">if</span> <span class="keyword">not</span> SystemApp.DataUtil.hasAuditData(code) <span class="keyword">and</span> <span class="keyword">not</span> SystemApp.DataUtil.hasHasVariable(code)
            <span class="keyword">return</span> code</pre></div>
        
      
        
        <p>These replace calls should use the same special keys defined on the
<a href="settings.html">Settings</a>, for both Audit Data and Variables.</p>

        
          <div class='highlight'><pre>        code = code.replace <span class="regexp">/\$+(\w+)(\W)/gi</span>, <span class="string">"SystemApp.Data.auditData.getByFriendlyId('$1').data()$2"</span>
        code = code.replace <span class="regexp">/\$+(\w+)(\W)/gi</span>, <span class="string">"SystemApp.Data.auditData.getByFriendlyId('$1').data()$2"</span>
        <span class="keyword">return</span> code</pre></div>
        
      
        
        <h2 id="other-helpers">OTHER HELPERS</h2>

        
      
        
        <p>Aggregate helper to check if there&#39;s dynamic data bound to the value.</p>

        
          <div class='highlight'><pre>    <span class="attribute">hasDataBindingValue</span>: <span class="function"><span class="params">(value)</span> =&gt;</span>
        hasAuditData = SystemApp.DataUtil.hasAuditData value
        hasCustomVar = SystemApp.DataUtil.hasHasVariable value
        hasEntityAttribute = SystemApp.DataUtil.hasEntityAttribute value
        <span class="keyword">return</span> hasAuditData <span class="keyword">or</span> hasCustomVar <span class="keyword">or</span> hasEntityAttribute</pre></div>
        
      
        
        <p>Aggregate helper for all the binding types. If no special binding was
found, then return the value itself.</p>

        
          <div class='highlight'><pre>    <span class="attribute">getDataBindingValue</span>: <span class="function"><span class="params">(value, ref)</span> =&gt;</span>
        <span class="keyword">return</span> <span class="string">""</span> <span class="keyword">if</span> <span class="keyword">not</span> value?

        value = value.toString()
        splitValue = value.split <span class="string">" "</span>
        newValue = <span class="string">""</span></pre></div>
        
      
        
        <p>Parse each value by checking if it represents a specific data.</p>

        
          <div class='highlight'><pre>        <span class="keyword">for</span> s <span class="keyword">in</span> splitValue
            <span class="keyword">if</span> s.substring(<span class="number">0</span>, <span class="number">1</span>) <span class="keyword">is</span> SystemApp.Settings.general.dataBindingKey
                <span class="keyword">if</span> SystemApp.DataUtil.hasAuditData s
                    newValue += <span class="string">" "</span> + SystemApp.DataUtil.getAuditDataValue s
                <span class="keyword">else</span> <span class="keyword">if</span> SystemApp.DataUtil.hasHasVariable s
                    newValue += <span class="string">" "</span> + SystemApp.DataUtil.getVariableValue s, ref
                <span class="keyword">else</span> <span class="keyword">if</span> SystemApp.DataUtil.hasEntityAttribute s
                    newValue += <span class="string">" "</span> + SystemApp.DataUtil.getEntityAttributeValue s, ref
                <span class="keyword">else</span>
                    newValue += <span class="string">" "</span> + s
            <span class="keyword">else</span>
                newValue += <span class="string">" "</span> + s

        <span class="keyword">return</span> newValue</pre></div>
        
      
      <div class="fleur">h</div>
    </div>
  </div>
</body>
</html>
